package com.xjl.example.threadpool;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 可伸缩的线程池
 * <p>
 * Created by xiaojinlu1990@163.com on 2019/12/1.
 * 线程池的核心方法--》会根据任务的多少弹性的增加或者减少线程池数量
 * 使用场景：在线程可控的情况下使用，否则可能会oom，线程过多导致系统性能过慢
 * <p>
 * <p>
 * public static ExecutorService newCachedThreadPool() {
 * return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
 * 60L, TimeUnit.SECONDS,
 * new SynchronousQueue<Runnable>());
 * }
 * <p>
 * 1.核心线程数为零
 * 2.最大线程数为无限
 * 3.无任务时，线程存活的最大时间为60s
 * 4.任务队列为同步移交队列，该队列没有缓冲区，即不会有任务会在该队列中排队，每当有任务要入队时，队列都会将任务移交给一个可用的线程
 * <p>
 * 参数解释
 *
 * @param int                     corePoolSize // 核心线程数，线程启动就一个线程保持线程数
 * @param int                     maximumPoolSize, // 最大线程数，线程池的最大线程数不能大于这个数
 * @param long                    keepAliveTime, //  超过线程的核心数 corePoolSize的线程数保持的时间
 * @param TimeUnit                unit,  //  时间的单位
 * @param BlockingQueue<Runnable> workQueue  //在线程池满的情况下，保持到该队列中。只保存runnble状态的
 *                                <p>
 *                                <p>
 *                                <p>
 *                                newCachedThreadPool
 *                                1 execute  调用线程功能执行
 *                                2 submit  调用线程执行有返回值
 *                                3 shoutDown  等任务执行完在停止
 *                                4 shoutDownNew 立即结束执行
 */
@Slf4j
public class ThreadPoolNewCacheThreadPoolExample {

    public static void main(String[] args) {
        ExecutorService service = Executors.newCachedThreadPool();
        for (int i = 0; i < 10000; i++) {
            service.execute(() -> {
                addTimeSleep();
            });

        }
        service.shutdown();
    }

    private static void addTimeSleep() {
        log.info("{}", Thread.currentThread().getName());
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }


    }

}
